package com.example.verification.demo;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 此工具类用于获得一个 字符串进过MD5加密后的密文字符串
 * 注意MD5是不可逆的加密算法
 * author HZY
 *
 */
public class MD5Utils {
	
	/*
	 * 传入原字符串返回MD5加密后的原字符串
	 */
	public static String getEncodeMD5String(String str) {
	
		//加盐:将用户的密码字符串加上一段自己的特殊字符串进行合并，然后再进MD5加密。
		// str=str+"hzy!@#";
		// 算法一
//        return encode(str, "MD5");
		// 算法二
        return md5(str); // 为了与其他客户端的MD5加密结果统一,目前使用此算法
	}

	/**
     * 使用此方法加密 ZrB5iUYZQMbo9xubgghO3M548d1eddac0058eca8f53f4e3566a4561 这个字符串时
     * 生成的结果为: 2a9040b4db3dba05e1d3081eacb0c5a
     * 实际上大部分工具网站MD5加密算法的计算结果为: 02a9040b4db3dba05e1d3081eacb0c5a ,也就是说此算法会把第一位的 0 剔除。
     */
    private static String encode(String str, String method) {
        MessageDigest md;
        String dstr = null;
        try {
            md = MessageDigest.getInstance(method);
            md.update(str.getBytes());
            dstr = new BigInteger(1, md.digest()).toString(16);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dstr;
    }

    /**
     * 使用此方法加密 ZrB5iUYZQMbo9xubgghO3M548d1eddac0058eca8f53f4e3566a4561 这个字符串时
     * 生成的结果为: 02a9040b4db3dba05e1d3081eacb0c5a
     */
    private static String md5(String string) {
        byte[] hash;

        try {
            hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("Huh, MD5 should be supported?", e);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("Huh, UTF-8 should be supported?", e);
        }

        StringBuilder hex = new StringBuilder(hash.length * 2);

        for (byte b : hash) {
            int i = (b & 0xFF);
            if (i < 0x10) hex.append('0');
            hex.append(Integer.toHexString(i));
        }

        return hex.toString();
    }
}
